#ifndef BAS_BAS_HASH_MAP_PRIVATE_H
#define BAS_BAS_HASH_MAP_PRIVATE_H

#include "bas/bas_container.h"

/**
 * 哈希映射初始大小, 2^n
 */
#define BAS_HASH_MAP_INIT_SIZE   32

/**
 * 哈希映射填充因子
 */
#define BAS_HASH_MAP_LOAD_FACTOR 0.6666667

/**
 * 哈希映射增长因子, 2^n
 */
#define BAS_MAP_EXPAND_MULTIPLICAND 2

/**
 * 哈希映射槽
 */
typedef struct T_HashMapSlot_tag
{
    unsigned int uiHashValue; ///<哈希值 
    void         *pvKey;      ///<关键字
    void         *pvValue;    ///<值
} T_HashMapSlot;

/**
 * 哈希映射
 */
typedef struct T_HashMap_tag
{
    T_IteratorCallBackTable *ptCallBackTable;       ///<迭代器回调函数表指针
    T_TypeInfo              tKeyTypeInfo;           ///<关键字的类型信息
    T_TypeInfo              tValueTypeInfo;         ///<值的类型信息
    T_HashFunction          pfnHash;                ///<哈希函数
    T_HashMapSlot           *taHashMapSlot;         ///<哈希表起始地址
    unsigned int            uiMask;                 ///<哈希值掩码, 哈希表共有iMask + 1个槽, (iMask + 1)是2的次方
    unsigned int            uiLimit;                ///<可以使用的哈希映射槽数上限
    unsigned int            uiUsed;                 ///<已使用的哈希映射槽数
} T_HashMap;

/**
 * @brief     创建一个哈希映射 
 * @param[in] tKeyTypeInfo   关键字的类型信息
 * @param[in] tValueTypeInfo 值的类型信息
 * @param[in] pfnHash        可选参数为用户指定的哈希函数指针, 类型为T_HashFunction
 * @returns   指向哈希映射的指针, 创建失败返回NULL
 * @note      本函数为内部函数, 不应该直接调用本函数
 */
T_HashMap *_basHashMapCreate(const T_TypeInfo tKeyTypeInfo, const T_TypeInfo tValueTypeInfo, ...);

#endif
